パイプラインのステップを 1 つに合成する
LT;DR
各ステップを合成する際に、入力と出力の型が異なる問題によく出くわす
https://scrapbox.io/files/66a9e4ce93b181001d498f16.png
hr.icon
イメージ
code:fsharp
let placeOrder: PlaceOrderWorkflow =
fun unvalidatedOrder ->
|> validateOrder
|> priceOrder
|> acknowledgeOrder
|> createEvents
問題点
validateOrder には 依存関係 の余計な入力が 2 つあるため、入力と出力が一致しない https://scrapbox.io/files/66a9e2f24f5917001c1cb168.png
priceOrder も同様に、余計な入力があるため一致しない
https://scrapbox.io/files/66a9e34059ddca001c21c2ba.png
「形」の異なる関数を合成することは、FP における主要な課題の 1 つ どう解決するか?
依存関係に関するパラメータだけを適用し、入力が 1 つだけの関数を作成する
https://scrapbox.io/files/66a9e4ce93b181001d498f16.png
code:fsharp
let validateOrder =
validateOrder checkProductCodeExists checkAddressExists
code:fsharp
let validateOrder' =
validateOrder checkProductCodeExists checkAddressExists
code:fsharp
let placeOrder: PlaceOrderWorkflow =
let validateOrder =
validateOrder checkProductCodeExists checkAddressExists
let priceOrder =
priceOrder getProductPrice
let acknowledgeOrder =
acknowledgeOrder createOrderAcknowledgmentLetter sendOrderAcknowledgment
fun unvalidatedOrder ->
unvalidatedOrder
|> validateOrder
|> priceOrder
// しかし、ここらへんでエラーが起きる…
|> acknowledgeOrder
|> createEvents
まだ解決できない問題がある
acknowledgeOrder の出力はイベントであり、createEvents の入力と合致しない
命令型 っぽく書けば良い
code:fsharp
let placeOrder: PlaceOrderWorkflow =
fun unvalidatedOrder ->
let validatedOrder =
unvalidatedOrder
|> validateOrder checkProductCodeExists checkAddressExists
let priceOrder =
validatedOrder
|> priceOrder getProductPrice
let acknowledgmentOption =
priceOrder
|> acknowledgeOrder
createOrderAcknowledgmentLetter
sendOrderAcknowledgment
let events =
createEvents acknowledgmentOption events
events